package com.tzy.common.constant;
/**
 * 统一响应封装返回封装类
 * @author 谭同学
 * @since 1.0
 */
public class RestResponse<T> {
    /**
     * 状态
     */
    private Integer status;
    /**
     * 提示信息
     */
    private String message;
    /**
     * 数据
     */
    private T data;
    /**
     * 防止实例化
     */
    private RestResponse() {
    }
    /**
     * 构建失败响应体
     *
     * @param errorStatus 失败状态码
     * @param message     错误信息
     * @param <T>         失败类型
     * @return 表示失败状态响应体
     */
    public static <T> RestResponse<T> fail(Integer errorStatus, String message) {
        return new RestResponse<T>().withStatus(errorStatus).withMessage(message);
    }

    /**
     * 构建表示失败状态的响应对象 ，状态默认为 {@link Codes#UNKNOWN_ERROR }
     *
     * @param message 错误信息
     * @param <T>     失败类型
     * @return 表示失败状态响应体
     */
    public static <T> RestResponse<T> fail(String message) {
        return new RestResponse<T>().withStatus(Codes.UNKNOWN_ERROR).withMessage(message);
    }

    /**
     * 构建表示成功状态的响应对象
     *
     * @return 表示成功状态的响应对象
     */
    public static RestResponse<?> ok() {
        return ok(null);
    }

    /**
     * 构建表示成功状态的响应对象
     * 状态默认为 {@link Codes#SUCCESS }
     * 提示信息默认为 OK
     *
     * @param data 附带的数据
     * @param <T>  附带数据的类型
     * @return 表示成功状态的响应对象
     */
    public static <T> RestResponse<T> ok(T data) {
        return new RestResponse<T>().withStatus(Codes.SUCCESS).withData(data).withMessage("OK");
    }

    /**
     * 返回状态码
     *
     * @return 状态码
     */
    public Integer getStatus() {
        return this.status;
    }

    /**
     * 返回提示信息
     *
     * @return 提示信息
     */
    public String getMessage() {
        return this.message;
    }

    /**
     * 返回数据
     *
     * @return 书
     */
    public T getData() {
        return data;
    }

    /**
     * 设置状态
     *
     * @param status 状态
     * @return this
     */
    public RestResponse<T> withStatus(Integer status) {
        this.status = status;
        return this;
    }

    /**
     * 设置数据
     *
     * @param data 数据
     * @return this
     */
    public RestResponse<T> withData(T data) {
        this.data = data;
        return this;
    }

    /**
     * 设置提示信息
     *
     * @param message 提示信息
     * @return this
     */
    public RestResponse<T> withMessage(String message) {
        this.message = message;
        return this;
    }

    /**
     * 如果<code>this.status</code>不等于 {@link Codes#SUCCESS}则抛出传入的异常，
     * 否则返回当前数据
     *
     * @param throwable 要抛出的异常对象
     * @return data
     */
    public T orElseThrow(RuntimeException throwable) {
        if (!isSuccess()) {
            throw throwable;
        }
        return data;
    }

    /**
     * 状态码是否为正常
     *
     * @return 返回状态码是否为正常
     */
    public boolean isSuccess() {
        return null != this.status && Codes.SUCCESS == this.status;
    }
}
